分类
联系方式
  1. 新浪微博
  2. E-mail

Dart eval:Program 类

介绍

一个 Program 类实例就是一个编译后的 EVC 字节码,可以直接由 dart_eval 的 Runtime 执行。

成员

topLevelDeclarations

程序顶层声明的全局字节码偏移量:

Map<int, Map<String, int>> topLevelDeclarations;

instanceDeclarations

程序的实例级声明的全局字节码偏移量:

/// Example instance declaration:
/// 1: { // file
///    "SomeClass": [
///       { "someProp": 221 }, // getters
///       { "someProp": 254 }, // setters
///       { "someMethod": 288 }, // methods
///    ]
/// }
Map<int, Map<String, List>> instanceDeclarations;

给了一个例子说明什么是实例级声明,但是还是每太看懂,是说 getter、setter、methods 都是实例级声明?还是说当他们返回常量时才是实例级声明?

typeNames

程序中使用的类型名称的有序列表,其索引与类型ID相对应。

List<String> typeNames;

字面理解,把程序中的类型收集起来了,成为一个列表。

typeTypes

程序中使用的类型超类型集(type supertype sets)的有序列表,其索引与类型ID相对应。

List<Set<int>> typeTypes;

什么叫使用的类型超类型集(type supertype sets)的有序列表。

bridgeLibraryMappings

从库URI到内部库ID的映射:

Map<String, int> bridgeLibraryMappings;

与桥接相关的,尽管 Key、Value 还不确定怎么回事。

bridgeFunctionMappings

从桥梁函数名称到内部 InvokeExternal ID 的映射。:

Map<int, Map<String, int>> bridgeFunctionMappings;

同上,dart_eval 支持两种桥接方式,一种是以库为粒度导出,一种是以函数粒度导出。

常量池

这俩比较容易理解,程序的常量池:

List<Object> constantPool;
List<RuntimeTypeSet> runtimeTypes;

globalInitializers

全局变量的初始化器的字节码偏移量:

List<int> globalInitializers;

enumMappings

从枚举到全局的映射:

Map<int, Map<String, Map<String, int>>> enumMappings;

字节码序列

List<EvcOp> ops;